2008/02/17

ロカポーターのしくみ(3)

3.データ途中の精度変更

高度を考えて見てください。仮にデータが1メートル単位として、地上付近では1メートル精度のデータが欲しい。でも飛行機で上空へ行けば10m単位や100m単位でも問題ない。このデータをどうやって混在させればよいのか。

高度    欲しい精度
00001    1m
00002    1m
00003    1m
00010    10m
00020    10m
00100    10m
01000    1000m
02000    1000m
05000    1000m

ロカポーターには答えがあります。
ロカポータ圧縮の前提は、「固定長文字列であること」ですので、その「固定長」の長さを途中で変えてしまえばいいのです。つまり、

高度    欲しい精度
00001    1m
00002    1m
00003    1m

0001(0)   10m
0002(0)   10m
0010(0)   10m

01(000)   1000m
02(000)   1000m
05(000)   1000m

の3つのセットに分けます。括弧の中は精度を落とせば不要となるデータです。
ところが、単に括弧の中を省略すれだけでは、不十分です。例えば、1000m精度のつもりの「01」が5桁の固定長と思われて「***01」と解釈されてしまいます。
そこで、精度を落とす記号を導入します。

高度    欲しい精度
00001    1m
00002    1m
00003    1m

0001_    10m <- 固定長5桁をこのデータ以降、1桁落として
               (アンダースコアが1つ)固定長4桁に変更
0002     10m
0003     10m

01__     100m <- 固定長4桁をこのデータ以降、2桁落として
                (アンダースコアが2つ)固定長2桁に変更
02      100m
05      100m


省略すると
00001     00001
00002       2
00003       3
0001_       1_
0002       2
0003       3
01__      1__
02       2
05       5

仮にこれらのデータをカンマ区切りでつなげてみるとこうなります。
(実際はカンマの部分には緯度経度など他のデータが入り込むことになります。)

00001,2,3,1_,2,3,1__,2,5

ちなみに可変精度を使わないと

00001,2,3,10,20,30,100,200,300

となります。


逆に精度を高めていくには、固定長の長さを増やします。
これにもアンダースコアを使いますが、現データの後に、アンダースコア+増加するデータを加えます。

高度    欲しい精度
05000   1000m
02000   1000m
01000   1000m
00100   10m
00020   10m
00010   10m
00003   1m
00002   1m
00001   1m

上記のデータは精度を変更すると、次のようになる。

高度    欲しい精度
05     1000m
02     1000m
01     1000m
00_10    10m  <- 固定長2桁をこのデータ以降、2桁増やして
            (アンダースコアの後の値が2つ)固定長4桁に変更
0002     10m
0001     10m
0000_3    1m  <- 固定長4桁をこのデータ以降、1桁増やして
            (アンダースコアの後の値が1つ)固定長5桁に変更
00002     1m
00001     1m

圧縮すると次のようになる。

05       05
02        2
01        1
00_10      0_10
0002        02
0001        1
0000_3       0_3
00002         2
00001         1

カンマ区切りでつなげてみるとこうなります。
(実際はカンマの部分には緯度経度など他のデータが入り込むことになります。)

05,2,1,0_10,02,1,0_3,2,1

ちなみに可変精度を使わないと

05000,2000,1000,0100,020,10,03,2,1

となります。

圧縮のアイデアは、このように高度のデータについて考えている時に出てきました。
当初は対数を使って、地上付近を密に、上空を粗くするコード体系を用意していたのですが、精度を可変にすることで、1番目のデータのみフル精度が必要であり、あとは好きな桁に落とせば良いことから、もっとも扱いやすい10進法のまま高度を扱うことにしました。


以上の
・固定長データの圧縮
・不定長データの接続
・精度記号によるデータの接続

が基本的なロカポーターの実装に必要なロジックとなります。

続く

0 件のコメント: